"""
AI Style 模块

该模块提供了与 AI 风格相关的 API 端点，包括创建、获取、更新和删除 AI 风格。
"""

from flask import Blueprint, request, jsonify
from flask_jwt_extended import jwt_required, get_jwt_identity
from app.services.ai_style_service import AIStyleService
from app.schemas import AIStyleSchema
from marshmallow import ValidationError

ai_style_bp = Blueprint('ai_style', __name__)
ai_style_schema = AIStyleSchema()

@ai_style_bp.route('/ai-styles', methods=['POST'])
@jwt_required()
def create_ai_style():
    """
    创建新的 AI 风格。

    请求体应包含以下字段：
    - name: 风格名称
    - prompt: 风格提示
    - description: （可选）风格描述

    返回：
    - 成功时返回创建的 AI 风格对象及状态码 201
    - 验证错误时返回错误信息及状态码 400
    - 重复条目错误时返回错误信息及状态码 409
    - 其他错误返回状态码 500
    """
    try:
        user_id = get_jwt_identity()
        data = ai_style_schema.load(request.get_json())
        
        ai_style = AIStyleService.create_ai_style(
            user_id=user_id,
            name=data['name'],
            prompt=data['prompt'],
            description=data.get('description')
        )
        
        return jsonify(ai_style.to_dict()), 201
        
    except ValidationError as err:
        return jsonify({'error': 'Validation error', 'messages': err.messages}), 400
    except ValueError as err:
        return jsonify({'error': 'Duplicate entry', 'message': str(err)}), 409
    except Exception:
        return jsonify({'error': 'Internal server error'}), 500

@ai_style_bp.route('/ai-styles', methods=['GET'])
@jwt_required()
def get_ai_styles():
    """
    获取当前用户的所有 AI 风格。

    返回：
    - 成功时返回 AI 风格列表及状态码 200
    - 其他错误返回状态码 500
    """
    try:
        user_id = get_jwt_identity()
        ai_styles = AIStyleService.get_user_ai_styles(user_id)
        return jsonify([style.to_dict() for style in ai_styles]), 200
    except Exception:
        return jsonify({'error': 'Internal server error'}), 500

@ai_style_bp.route('/ai-styles/<int:style_id>', methods=['GET'])
@jwt_required()
def get_ai_style(style_id):
    """
    根据风格 ID 获取单个 AI 风格。

    参数：
    - style_id: AI 风格的唯一标识符

    返回：
    - 成功时返回 AI 风格对象及状态码 200
    - 未找到时返回错误信息及状态码 404
    - 其他错误返回状态码 500
    """
    try:
        user_id = get_jwt_identity()
        ai_style = AIStyleService.get_ai_style(user_id, style_id)
        
        if not ai_style:
            return jsonify({'error': 'AI style not found'}), 404
            
        return jsonify(ai_style.to_dict()), 200
    except Exception:
        return jsonify({'error': 'Internal server error'}), 500

@ai_style_bp.route('/ai-styles/<int:style_id>', methods=['PUT'])
@jwt_required()
def update_ai_style(style_id):
    """
    更新指定的 AI 风格。

    参数：
    - style_id: AI 风格的唯一标识符

    请求体应包含以下字段：
    - name: （可选）新的风格名称
    - prompt: （可选）新的风格提示
    - description: （可选）新的风格描述

    返回：
    - 成功时返回更新后的 AI 风格对象及状态码 200
    - 验证错误时返回错误信息及状态码 400
    - 未找到时返回错误信息及状态码 404
    - 其他错误返回状态码 500
    """
    try:
        user_id = get_jwt_identity()
        ai_style = AIStyleService.get_ai_style(user_id, style_id)
        
        if not ai_style:
            return jsonify({'error': 'AI style not found'}), 404
            
        data = ai_style_schema.load(request.get_json())
        ai_style = AIStyleService.update_ai_style(
            ai_style,
            name=data.get('name'),
            prompt=data.get('prompt'),
            description=data.get('description')
        )
        
        return jsonify(ai_style.to_dict()), 200
    except ValidationError as err:
        return jsonify({'error': 'Validation error', 'messages': err.messages}), 400
    except Exception:
        return jsonify({'error': 'Internal server error'}), 500

@ai_style_bp.route('/ai-styles/<int:style_id>', methods=['DELETE'])
@jwt_required()
def delete_ai_style(style_id):
    """
    删除指定的 AI 风格。

    参数：
    - style_id: AI 风格的唯一标识符

    返回：
    - 成功时返回删除成功的消息及状态码 200
    - 未找到时返回错误信息及状态码 404
    - 其他错误返回状态码 500
    """
    try:
        user_id = get_jwt_identity()
        ai_style = AIStyleService.get_ai_style(user_id, style_id)
        
        if not ai_style:
            return jsonify({'error': 'AI style not found'}), 404
            
        AIStyleService.delete_ai_style(ai_style)
        return jsonify({'message': 'AI style deleted successfully'}), 200
    except Exception:
        return jsonify({'error': 'Internal server error'}), 500
